// ブラウザ三国志　自動出兵ツール
// 出兵確認画面で、指定時間に「出兵」ボタンを自動クリックする。
//
// 出兵時間を指定する枠を表示　[HH]時[MM]分
// 指定時間になったら出兵ボタンが押される（マウスでクリックしたのと同じ動作をする）。
// そのため、確認画面を開っぱなしにしておく。
// アクセス時間があきすぎるとセッションタイムアウトになってしまう可能性あり。
// 予約時間はサーバー時間ではなくマシン時間
//
// ver0.3.r2  2011-04-06 セッションタイムアウト防止部分を分離
// ver0.3.r1  2011-03-27 着弾時間指定で出兵できるように変更。
//                       セッションをチャットリロードで維持できるように変更。←テストできてないよん
//                       時間が過ぎていても60秒以内なら出兵するように変更。
// ver0.3  2010-05-24 本拠地以外から出兵できるように修正,Google Chromeでも動作を確認
// ver0.2  2010-05-22 秒までの指定に対応
// ver0.1  2010-05-22 新規作成
//
// Released under the GPL license
// 
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: https://addons.mozilla.org/en-US/firefox/addon/748
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Hello World", and click Uninstall.
//
// --------------------------------------------------------------------
// ==UserScript==
// @name          3gokushi autoTroop
// @version       0.3.r2
// @namespace     http://mixi.jp/
// @description   出兵時間を予約
// @include       http://*.3gokushi.jp/facility/*
// ==/UserScript==


window.executeTroop = function()
{
    var btn = window.document.getElementById("btn_send");
    btn.click();
}
window.displayTroop = function()
{
    var obj = window.document.getElementById("gray02Wrapper");
    var html = "";
    html += '<strong>【出兵予約】</strong> ';
    html += '<select id="autoTroop_HH"><option value="">--</option>';
    for ( var i=0; i < 24; i++) {
        html += '<option value="' + i + '">' + i +'</option>';
    }
    html += '</select>';
    html += '時';
    html += '<select id="autoTroop_MM"><option value="">--</option>';
    for ( var i=0; i < 60; i++) {
        html += '<option value="' + i + '">' + i +'</option>';
    }
    html += '</select>';
    html += '分';
    // 秒の指定
    html += '<select id="autoTroop_SS"><option value="">--</option>';
    for ( var i=0; i < 60; i++) {
        html += '<option value="' + i + '">' + i +'</option>';
    }
    html += '</select>';
    html += '秒';
    // 出兵or着弾の指定
    html += '<select id="autoTroop_TT">';
    html += '<option value="start">出兵</option>';
    html += '<option value="arrival">着弾</option>';
    html += '</select>';
    html += 'するように';
    //設定ボタン
    html += '<input id="setting_button" type="button" value="設定" /><br />';
    html += '<span id="setting_start_HH">--</span>時<span id="setting_start_MM">--</span>分<span id="setting_start_SS">--</span>秒に出発予定<br />';
    html += '<span id="setting_arrival_HH">--</span>時<span id="setting_arrival_MM">--</span>分<span id="setting_arrival_SS">--</span>秒に着弾予定<br />';
    html += '<span id="autoTroop_hms">(最終チェック--時--分)</span><br />';
    obj.innerHTML += '<div style="text-align:center; border:3px #000 solid;padding:6px;-moz-border-radius: 10px;-webkit-border-radius: 10px;border-radius: 10px;">' + html + "</div>";
    // 0.5秒間隔でチェックする
    window.document.getElementById("setting_button").addEventListener('click', setTroopTime, true);
    window.setInterval(function(){ checkTroopTime() } , 0.5 * 1000);
};

var setTroopTime = function()
{
    var h = parseInt(window.document.getElementById("autoTroop_HH").value, 10);
    var m = parseInt(window.document.getElementById("autoTroop_MM").value, 10);
    var s = parseInt(window.document.getElementById("autoTroop_SS").value, 10);
    if (isNaN(m)) {
     m = 0;
    }
    if (isNaN(s)) {
     s = 0;
    }
    var t = window.document.getElementById("autoTroop_TT").value;
    var i = window.document.evaluate('//table[@class=\'fighting_about\']//td', window.document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).textContent.match(/到着まで[:|：][\s|　]*(\d+):(\d+):(\d+)[\s|　]*到達時間/);
    var sh = window.document.getElementById("setting_start_HH");
    var sm = window.document.getElementById("setting_start_MM");
    var ss = window.document.getElementById("setting_start_SS");
    var ah = window.document.getElementById("setting_arrival_HH");
    var am = window.document.getElementById("setting_arrival_MM");
    var as = window.document.getElementById("setting_arrival_SS");
    
    if (t == 'start') {
      sh.innerHTML = h;
      sm.innerHTML = m;
      ss.innerHTML = s;      
      var dt = new Date();
      dt.setHours(h + parseInt(i[1], 10));
      dt.setMinutes(m + parseInt(i[2], 10));
      dt.setSeconds(s + parseInt(i[3], 10));
      ah.innerHTML = dt.getHours();
      am.innerHTML = dt.getMinutes();
      as.innerHTML = dt.getSeconds();
    } else if (t == 'arrival') {
      ah.innerHTML = h;
      am.innerHTML = m;
      as.innerHTML = s;
      var dt = new Date();
      dt.setHours(h - parseInt(i[1], 10));
      dt.setMinutes(m - parseInt(i[2], 10));
      dt.setSeconds(s - parseInt(i[3], 10));
      sh.innerHTML = dt.getHours();
      sm.innerHTML = dt.getMinutes();
      ss.innerHTML = dt.getSeconds();
    }
};

window.checkTroopTime = function()
{
    var h = parseInt(window.document.getElementById("setting_start_HH").innerHTML, 10);
    var m = parseInt(window.document.getElementById("setting_start_MM").innerHTML, 10);
    var s = parseInt(window.document.getElementById("setting_start_SS").innerHTML, 10);
    if (!isNaN(h)) {
      var sdt = new Date();
      sdt.setHours(h);
      sdt.setMinutes(m);
      sdt.setSeconds(s);
    
      // 現在時刻取得
      var now = new Date();

      if (sdt.getTime() <= now.getTime() && sdt.getTime() + 60 * 1000 > now.getTime()) {
          executeTroop();
      }
      
      // 予約が有効なことを表示
      var obj = window.document.getElementById("autoTroop_hms");
      obj.innerHTML = "(最終チェック" + now.getHours() + "時" + now.getMinutes() + "分)";
    }
};

var title = window.document.title;
if ( title.indexOf("出兵(確認) - ブラウザ三国志") != -1 ) {
  window.displayTroop();
} else {
  // 出兵確認画面でなければ何もしない
}
